package controller

import (
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"mail/app/config"
	"mail/app/model"
	"net/http"
)

type User struct {
	warpHttp
}

func (s *User) LoginHandler(c *gin.Context) {
	cont, _ := ioutil.ReadAll(c.Request.Body)
	if cont == nil {
		config.GetLogger().Warnw("账号密码不能为空",
			"cont", cont,
		)
		c.JSON(http.StatusOK, s.FailWarp("账号密码不能为空"))
		return
	}

	user := model.NewUser()

	data, err := user.Login(string(cont))
	if err != nil {
		config.GetLogger().Warnw("数据查询失败",
			"err", err.Error(),
		)
		c.JSON(http.StatusOK, s.FailWarp(err.Error()))
		return
	}

	c.JSON(http.StatusOK, s.SuccessWarp(data))
}

func (s *User) RegisterHandler(c *gin.Context) {

	cont, _ := ioutil.ReadAll(c.Request.Body)

	if cont == nil {
		config.GetLogger().Warnw("账户信息不能为空",
			"cont:", cont,
		)
		c.JSON(http.StatusOK, s.FailWarp("账号信息不能为空"))
		return
	}

	user := model.NewUser()

	err := user.Register(string(cont))
	if err != nil {
		config.GetLogger().Warnw("注册数据查询失败",
			"err", err.Error(),
		)
		c.JSON(http.StatusOK, s.FailWarp(err.Error()))
		return
	}

	c.JSON(http.StatusOK, s.SuccessWarp(nil))
}

func (s *User) GetUserInfoHandler(c *gin.Context) {

	cont, _ := ioutil.ReadAll(c.Request.Body)

	if cont == nil {
		config.GetLogger().Warnw("用户ID不能为空",
			"cont:", cont,
		)
		c.JSON(http.StatusOK, s.FailWarp("用户ID不能为空"))
		return
	}

	user := model.NewUser()

	data, err := user.UserInfo(string(cont))
	if err != nil {
		config.GetLogger().Warnw("用户数据查询失败",
			"err", err.Error(),
		)
		c.JSON(http.StatusOK, s.FailWarp(err.Error()))
		return
	}

	c.JSON(http.StatusOK, s.SuccessWarp(data))
}

func (s *User) GetUserSendBoxHandler(c *gin.Context) {

	cont, _ := ioutil.ReadAll(c.Request.Body)

	if cont == nil {
		config.GetLogger().Warnw("用户邮箱不能为空",
			"cont:", cont,
		)
		c.JSON(http.StatusOK, s.FailWarp("用户邮箱不能为空"))
		return
	}

	user := model.NewUser()

	data, err := user.UserSendBox(string(cont))
	if err != nil {
		config.GetLogger().Warnw("邮箱数据查询失败",
			"err", err.Error(),
		)
		c.JSON(http.StatusOK, s.FailWarp(err.Error()))
		return
	}

	c.JSON(http.StatusOK, s.SuccessWarp(data))
}

func (s *User) GetUserRecycleBoxHandler(c *gin.Context) {

	cont, _ := ioutil.ReadAll(c.Request.Body)

	if cont == nil {
		config.GetLogger().Warnw("用户邮箱不能为空",
			"cont:", cont,
		)
		c.JSON(http.StatusOK, s.FailWarp("用户邮箱不能为空"))
		return
	}

	user := model.NewUser()

	data, err := user.UserRecycleBox(string(cont))
	if err != nil {
		config.GetLogger().Warnw("邮箱数据查询失败",
			"err", err.Error(),
		)
		c.JSON(http.StatusOK, s.FailWarp(err.Error()))
		return
	}

	c.JSON(http.StatusOK, s.SuccessWarp(data))
}

func (s *User) DelUserSendMailHandler(c *gin.Context) {

	cont, _ := ioutil.ReadAll(c.Request.Body)

	if cont == nil {
		config.GetLogger().Warnw("用户邮箱与邮件ID不能为空",
			"cont:", cont,
		)
		c.JSON(http.StatusOK, s.FailWarp("用户邮箱与邮件ID不能为空"))
		return
	}

	user := model.NewUser()

	err := user.DeleteSentMail(string(cont))
	if err != nil {
		config.GetLogger().Warnw("邮箱数据查询失败",
			"err", err.Error(),
		)
		c.JSON(http.StatusOK, s.FailWarp(err.Error()))
		return
	}

	c.JSON(http.StatusOK, s.SuccessWarp(nil))
}

func (s *User) RecoverMailHandler(c *gin.Context) {

	cont, _ := ioutil.ReadAll(c.Request.Body)

	if cont == nil {
		config.GetLogger().Warnw("用户邮箱与邮件ID不能为空",
			"cont:", cont,
		)
		c.JSON(http.StatusOK, s.FailWarp("用户邮箱与邮件ID不能为空"))
		return
	}

	user := model.NewUser()

	err := user.RecoverMail(string(cont))
	if err != nil {
		config.GetLogger().Warnw("邮箱数据查询失败",
			"err", err.Error(),
		)
		c.JSON(http.StatusOK, s.FailWarp(err.Error()))
		return
	}

	c.JSON(http.StatusOK, s.SuccessWarp(nil))
}

func (s *User) EmptyRecycleBoxHandler(c *gin.Context) {

	cont, _ := ioutil.ReadAll(c.Request.Body)

	if cont == nil {
		config.GetLogger().Warnw("用户邮箱与邮件ID不能为空",
			"cont:", cont,
		)
		c.JSON(http.StatusOK, s.FailWarp("用户邮箱与邮件ID不能为空"))
		return
	}

	user := model.NewUser()

	err := user.EmptyRecycleBox(string(cont))
	if err != nil {
		config.GetLogger().Warnw("邮箱数据查询失败",
			"err", err.Error(),
		)
		c.JSON(http.StatusOK, s.FailWarp(err.Error()))
		return
	}

	c.JSON(http.StatusOK, s.SuccessWarp(nil))
}

func (s *User) ChangeInfoHandler(c *gin.Context) {

	cont, _ := ioutil.ReadAll(c.Request.Body)

	if cont == nil {
		config.GetLogger().Warnw("用户ID与用户名不能为空",
			"cont:", cont,
		)
		c.JSON(http.StatusOK, s.FailWarp("用户ID与用户名不能为空"))
		return
	}

	user := model.NewUser()

	err := user.ChangeInfo(string(cont))
	if err != nil {
		config.GetLogger().Warnw("更新个人信息失败",
			"err", err.Error(),
		)
		c.JSON(http.StatusOK, s.FailWarp(err.Error()))
		return
	}

	c.JSON(http.StatusOK, s.SuccessWarp(nil))
}

func (s *User) ChangePwdHandler(c *gin.Context) {

	cont, _ := ioutil.ReadAll(c.Request.Body)

	if cont == nil {
		config.GetLogger().Warnw("用户ID与密码不能为空",
			"cont:", cont,
		)
		c.JSON(http.StatusOK, s.FailWarp("用户ID与密码不能为空"))
		return
	}

	user := model.NewUser()

	err := user.ChangePwd(string(cont))
	if err != nil {
		config.GetLogger().Warnw("修改密码失败",
			"err", err.Error(),
		)
		c.JSON(http.StatusOK, s.FailWarp(err.Error()))
		return
	}

	c.JSON(http.StatusOK, s.SuccessWarp(nil))
}
